package bender.appl.io;

import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader;
import org.joone.io.PatternTokenizer;

/**
 *
 * Encargada de separar los tokens (0,1)
 * @author Ramiro
 */
public class ArchivoBinarioTokenizer implements PatternTokenizer {

    /**
     * Constante con el tamaño del buffer de lectura
     */
    private static final int MAX_BUFFER_SIZE = 1048576; // 1 MByte
    private static final int CANT_NUMEROS = 93000;
            /**
             * Tamaño del buffer de lectura
             */
    private
     int maxBufSize;
    /**
     * Stream de entrada
     */
    private LineNumberReader stream;
    /**
     * Número de tokens
     */
    private int numTokens = 0;
    /**
     * tokens de resultado
     */
    private double[] tokensArray = new double[CANT_NUMEROS];
    /**
     * separador de decimales
     */
    private char m_decimalPoint = '.';

    public ArchivoBinarioTokenizer(Reader in) throws java.io.IOException {
        this(in, MAX_BUFFER_SIZE);
    }

    public ArchivoBinarioTokenizer(Reader in, int maxBufSize) throws IOException {
        this.maxBufSize = maxBufSize;
        stream = new LineNumberReader(in, maxBufSize);
        stream.mark(maxBufSize);
    }

    public int getLineno() {
        return stream.getLineNumber();
    }

    public int getNumTokens() throws IOException {
        return numTokens;
    }

    public double getTokenAt(int i) throws IOException {
        if (tokensArray == null) {
            if (!nextLine()) {
                return 0;
            }
        }
        if (tokensArray.length <= i) {
            return 0;
        }
        return tokensArray[i];
    }

    public double[] getTokensArray() {
        return tokensArray;
    }

    public void mark() throws IOException {
        stream.mark(maxBufSize);
    }

    public boolean nextLine() throws IOException {
        char[] vectorArchivo = new char[CANT_NUMEROS];

        stream.read(vectorArchivo);
        for (int i = 0; i < vectorArchivo.length; i++) {
            String caracter = Character.toString(vectorArchivo[i]);
            if (esCaracterBinario(caracter)) {
                tokensArray[i] = Double.parseDouble(caracter);
            }

        }
        return true;
    }

    /*String linea = stream.readLine();
    if (linea != null) {
    numTokens = linea.length();
    if (tokensArray == null) {
    tokensArray = new double[numTokens];
    } else if (tokensArray.length != numTokens) {
    tokensArray = new double[numTokens];
    }
    for (int i = 0; i < numTokens; ++i) {
    String caracter = Character.toString(linea.charAt(i));
    if (esCaracterBinario(caracter)) {
    tokensArray[i] = Double.parseDouble(caracter);


    }
    }
    return true;
    } else {
    return false;
    }
    }*/
    public void resetInput() throws IOException {
        stream.reset();
    }

    public char getDecimalPoint() {
        return m_decimalPoint;
    }

    public void setDecimalPoint(char decimalPoint) {
        m_decimalPoint = decimalPoint;
    }

    private boolean esCaracterBinario(String caracter) {
        return caracter.equals("1") || caracter.equals("0");
    }
}
